Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

C++ - Do...while - problem


Rekomendowane odpowiedzi

Opublikowano

Siemanko ;P Od razu przechodze do konkretów, problem jest z pętlą do while w tym kodzie programu:

 

 

#include <iostream>
int main()
{

do
{


	int liczba;
	std::cout << "Podaj liczbe: ";
	std::cin >> liczba;
	bool x = std::cin.good();
	if ( x = 1 )
	{
		std::cout << "Brawo, podales liczbe: " << liczba << std::endl;
	}

	else
	{
		std::cout << "Niestety wystapil blad, wprowadz liczbe jeszcze raz" << std::endl;
	}

} while (x != 0);

std::cout << "Koniec" << std::endl;
return 0;
}

 

 

Błędy z kompilatora: In function int main() : x wasn't declared in this scope

 

 

Istota tego banału:

1. Podaj liczbę

2. Jeżeli błąd, wróć do kroku 1.

3. Wypisz liczbę, która została podana.

 

Dopiero zacząłem nauke c++ kilka dni temu, korzystam z kursu na cpp0x.pl i mam problem z tym cholernym zadaniem domowym gdyz jak wpisze zeby bylo zle np. asdasdad, to program ciagle nakurwia tekst i nic nie da sie zrobic. Jesli zmienilem warunek while na std::cin.fail() to wlasnie tak program dzialal..Prosze o pomoc, za pomoc +.

 

Pierwszy problem juz został rozwiązany teraz mam drugi...

 

#include <iostream>
int main()
{
std::cout << "Witaj w Kalkulatorze by Beny v1" << std::endl;
int koniec;
int x;
do
{
std::cout << "Menu: " << std::endl;
std::cout << "[1] Dodawanie " << std::endl;
std::cout << "[2] Odejmowanie " << std::endl;
std::cout << "[3] Mnozenie " << std::endl;
std::cout << "[4] Dzielenie " << std::endl;
std::cout << "[5] Rezygnuj " << std::endl;
std::cout << "Wprowadz liczbe : " << std::endl;
int liczba;
std::cin >> liczba;
std::cin.clear();
std::cin.ignore( 256, '\n' );

if( liczba != 0 )
{
	std::cout << "Wybierz dzialanie: " << std::endl;
	std::cin >> x;
	std::cin.clear();
	std::cin.ignore(256, '\n');
	std::cout << "Do kazdego dzialania zostanie wykorzystana druga liczba: 7" << std::endl;
switch( x );
{
	case 1:
	std::cout << "Wynik dodawania to: " << liczba + 7 << std::endl;
	break;
	case 2:
	std::cout << "Wynik odejmowania to: " << liczba - 7 << std::endl;
	break;
	case 3:
	std::cout << "Wynik mnozenia to: " << liczba * 7 << std::endl;
	break;
	case 4:
	std::cout << "Wynik dzielenia to: " << liczba / 7 << std::endl;
	break;
	case 5:
	std::cout << "Rezygnujesz z dzialania programu" << std::endl;
	koniec = 1;
	break;
	default:
	std::cout << "Niestety, wybrales nieprawidlowe dzialanie, program zostanie wylaczony" <<std::endl;
	koniec = 1;
	break;
}
}
else
koniec = 1;
} while ( koniec == 123 );
return 0;
}

 

Błędy z kompilatora brzmią tak samo:

 

error: case label '1' not within a switch statement
error: case label '2' not within a switch statement
error: case label '3' not within a switch statement
error: case label '4' not within a switch statement
error: case label '5' not within a switch statement
error: case label  not within a switch statement

 

Proszę o pomoc. ;)

 

Pełen kod dzialającego drugiego problemu ( wkoncu ):


#include <iostream>
int main()
{
std::cout << "Witaj w Kalkulatorze by Beny v1" << std::endl;
int liczba;
int x;
do
{
std::cout << "Menu: " << std::endl;
std::cout << "[1] Dodawanie " << std::endl;
std::cout << "[2] Odejmowanie " << std::endl;
std::cout << "[3] Mnozenie " << std::endl;
std::cout << "[4] Dzielenie " << std::endl;
std::cout << "[5] Rezygnuj " << std::endl;[/center]


std::cout << "Wprowadz liczbe : ";
std::cin >> liczba;
std::cin.clear();
std::cin.ignore( 256, '\n' );

if( liczba != 0 )
{
std::cout << "Wybierz dzialanie: ";
std::cin >> x;
std::cin.clear();
std::cin.ignore ( 1000, '\n' );
}
else
x = false;
if ( x != 0 || x <= 5 )
{

switch( x )
{
case 1:
std::cout << "Wynik dodawania to: " << liczba + 7 << std::endl;
break;
case 2:
std::cout << "Wynik odejmowania to: " << liczba - 7 << std::endl;
break;
case 3:
std::cout << "Wynik mnozenia to: " << liczba * 7 << std::endl;
break;
case 4:
std::cout << "Wynik dzielenia to: " << liczba / 7 << std::endl;
break;
case 5:
std::cout << "Rezygnujesz z dzialania programu";
break;
default:
std::cout << "Niestety, wybrales nieprawidlowe dzialanie, program zostanie wylaczony";
break;
}
}
} while ( x );
return 0;
}


Opublikowano

#include <iostream>
int main()
{
bool x;
    do
    {

		    int liczba;
		    std::cout << "Podaj liczbe: ";
		    std::cin >> liczba;
		    x = std::cin.good();
		    if ( x = 1 )
		    {
				    std::cout << "Brawo, podales liczbe: " << liczba << std::endl;
		    }
		    else
		    {
				    std::cout << "Niestety wystapil blad, wprowadz liczbe jeszcze raz" << std::endl;
		    }
    } while (x != 0);
    std::cout << "Koniec" << std::endl;
return 0;
}

tak?

 

wypisuj czy jakieś inne błędy to są, czy te same, czy cokolwiek.

Opublikowano

Niestety nadal to samo z twoim kodem Sopelek, chodzi o to, że masz podać liczbe jak podasz asd131safaqca\sc czy cos to ma sie wyswietlic: Niestety wystapil blad... itd i pokazac sie znowu : Podaj liczbe:, podaj np. 1 i wyświetla się: Brawo, podales liczbe : 1 i koniec programu, a w tym kodzie co ty napisales to do nieskonczonosci sie wyswietla jesli napiszesz litere np. Podaj liczbe:Brawo podales liczbe:

26387 cos takiego.

Czyli chodzi o to, że:

- podajesz liczbe

- jesli wpisales litery badz cos innego niz liczbe to ma cie cofnac do kroku pierwszego, a jesli podales to

- wyswietla sie: Podales liczbe: 8 i Koniec.

Opublikowano

#include <iostream>
int main()
{
bool x;
do
{

int liczba;
std::cout << "Podaj liczbe: ";
std::cin >> liczba;
x = std::cin.good();
if ( x == 1 )
{
std::cout << "Brawo, podales liczbe: " << liczba << std::endl;
}
else
{
std::cout << "Niestety wystapil blad, wprowadz liczbe jeszcze raz" << std::endl;
}
} while (x != 0);
std::cout << "Koniec" << std::endl;
return 0;
}

 

@UP

Nie, nie to samo.

Kod z początku tematu w ogóle się nie kompilował. Poza instrukcją blokową wykorzystywałeś zmienną z bloku. Nie możesz tego robić.

 

Błąd, który poprawiłem powyżej, to:

x = std::cin.good();
if ( x = 1 ); przypisałeś, zamiast porównać
{

 

Natomiast osobiście zrobiłbym tak:

 

#include <iostream>
int main()
{
do
{

int liczba;
std::cout << "Podaj liczbe: ";
std::cin >> liczba;
if ( std::cin.good() )
{
std::cout << "Brawo, podales liczbe: " << liczba << std::endl;
}
else
{
std::cout << "Niestety wystapil blad, wprowadz liczbe jeszcze raz" << std::endl;
break;
}
} while ( true );
std::cout << "Koniec" << std::endl;
return 0;
}

Bo po co dwa razy porównywać i przechowywać tę informację (.good()) w pamięci.

 

Ta sygnatura jest pusta.

Opublikowano

Prawie jest dobrze tylko.. Jak wyswietli sie ze jest blad to nie cofa do kroku pierwszego zeby znowu pisac liczbe i jesli ona bedzie poprawna, to wtedy ma sie skonczyc pętla.

Opublikowano

Możliwie najprościej:

while (!(std::cin >> zmienna))
{
	  std::cin.clear();
	  std::cin.ignore(256, '\n');
	  std::cout << "Zła liczba! Podaj jeszcze raz: ";
}

cin.ignore() zapobiega potencjalnej probie wpisania dwóch lub więcej zmiennych (użycia spacji)

Chcesz zarobić na własnym cheacie/bocie? Pisz na PM

Cracking, analiza programu/strony, boty (także web), cheaty

kwoh2cmd.png

Opublikowano

Mógłbyś mi to jakoś w kod klepać czy coś? Bo to to na prawde nie bardzo rozumiem. Problem zostal zażegnany.

Dalem edita pierwszego posta, tam mam opisany drugi problem.

Opublikowano

 

#include <iostream>
int main()
{
std::cout << "Witaj w Kalkulatorze by Beny v1" << std::endl;
int koniec;
int x;
do
{
std::cout << "Menu: " << std::endl;
std::cout << "[1] Dodawanie " << std::endl;
std::cout << "[2] Odejmowanie " << std::endl;
std::cout << "[3] Mnozenie " << std::endl;
std::cout << "[4] Dzielenie " << std::endl;
std::cout << "[5] Rezygnuj " << std::endl;
std::cout << "Wprowadz liczbe : " << std::endl;
int liczba;
std::cin >> liczba;
std::cin.clear();
std::cin.ignore( 256, '\n' );

if( liczba != 0 )
{
std::cout << "Wybierz dzialanie: " << std::endl;
std::cin >> x;
std::cin.clear();
std::cin.ignore(256, '\n');
std::cout << "Do kazdego dzialania zostanie wykorzystana druga liczba: 7" << std::endl;
switch( x )
{
case 1:
std::cout << "Wynik dodawania to: " << liczba + 7 << std::endl;
break;
case 2:
std::cout << "Wynik odejmowania to: " << liczba - 7 << std::endl;
break;
case 3:
std::cout << "Wynik mnozenia to: " << liczba * 7 << std::endl;
break;
case 4:
std::cout << "Wynik dzielenia to: " << liczba / 7 << std::endl;
break;
case 5:
std::cout << "Rezygnujesz z dzialania programu" << std::endl;
koniec = 1;
break;
default:
std::cout << "Niestety, wybrales nieprawidlowe dzialanie, program zostanie wylaczony" <<std::endl;
koniec = 1;
break;
}
}
else
koniec = 1;
} while ( koniec == 123 );
return 0;
}

 

 

" switch( x ) "

zamiast

" switch( x ) ; "

 

Ze średnikiem, kompilator interpretuje to jako pustego switch'a ( nie przyrównuje do niczego, czyli - zoptymalizowany - najpewniej w ogóle ignoruje ), po którym następuje najzwyklejsza instrukcja blokowa.

Coś jak

 

#include <iostream>
int main() { 
// przestrzeń main'a 
int x = 4; 
{  
  // przestrzeń "najzwyklejszej" instrukcji blokowej
  int x = 5; 
  std::cout << x; 
} 
std::cout << x; 
} 

 

Nie może tam być średnika, żeby kompilator tę instrukcję blokową interpretował jako część switch'a - a tylko w takich blokach keyword "case" jest dozwolony.

Ta sygnatura jest pusta.

Opublikowano

Dziękuje Ci serdecznie

4ggr35510n'ie ;) Na prawdę bardzo mi pomogłeś niczym. Jak cie zauważe w jakimś temacie masz odemnie plusika zawsze :)

 

Dobra wiem wiem.. znowu cos powalilem.. ale... program cos nie dziala jak powinien.. pętla sie przerywa jak jest dobra liczba wpisana i jak jest zla wpisana, a ma dzialac tak, ze jak dobra liczba jest wpisana i dobre dzialanie to wyswietlic wynik dzialania i wrocic do kroku pierwszego, czyli do pokazania liczby... OMFG nie ogarniam..

Szczyt debilizmu osiągnięty przeze mnie nie jest do ogarnięcia... Wystarczyło dodać jedno else i zdefiniować zmienną x.... Temat już może zostać zamkniety.

 

Podaję pełen kod programu jakby ktos mial ten sam problem:

 

#include <iostream>
int main()
{
   std::cout << "Witaj w Kalkulatorze by Beny v1" << std::endl;
int liczba;
int x;
do
{
   std::cout << "Menu: " << std::endl;
   std::cout << "[1] Dodawanie " << std::endl;
   std::cout << "[2] Odejmowanie " << std::endl;
   std::cout << "[3] Mnozenie " << std::endl;
   std::cout << "[4] Dzielenie " << std::endl;
   std::cout << "[5] Rezygnuj " << std::endl;
   std::cout << "Wprowadz liczbe : ";
   std::cin >> liczba;
   std::cin.clear();
   std::cin.ignore( 256, '\n' );

   if( liczba != 0 )
   {
    std::cout << "Wybierz dzialanie: ";
    std::cin >> x;
    std::cin.clear();
    std::cin.ignore ( 1000, '\n' );
   }
   else
    x = false;
   if ( x != 0 || x <= 5 )
   {

   switch( x )
   {
    case 1:
    std::cout << "Wynik dodawania to: " << liczba + 7 << std::endl;
    break;
    case 2:
    std::cout << "Wynik odejmowania to: " << liczba - 7 << std::endl;
    break;
    case 3:
    std::cout << "Wynik mnozenia to: " << liczba * 7 << std::endl;
    break;
    case 4:
    std::cout << "Wynik dzielenia to: " << liczba / 7 << std::endl;
    break;
    case 5:
    std::cout << "Rezygnujesz z dzialania programu";
    break;
    default:
    std::cout << "Niestety, wybrales nieprawidlowe dzialanie, program zostanie wylaczony";
    break;
   }
   }
} while ( x );
return 0;
}

 

Jeszcze coś sie kiepsci jak dam rezygnuj przy wyborze dzialania, ale to sie wytnie ;d

Jeszcze troche pomyśle i wyjdzie :P

Opublikowano

edytuj

	std::cout << "Menu: " << std::endl;
std::cout << "[1] Dodawanie " << std::endl;
std::cout << "[2] Odejmowanie " << std::endl;
std::cout << "[3] Mnozenie " << std::endl;
std::cout << "[4] Dzielenie " << std::endl;
std::cout << "[5] Rezygnuj " << std::endl;
std::cout << "Wprowadz liczbe : ";
std::cin >> liczba;
std::cin.clear();
std::cin.ignore( 256, '\n' );
if(liczba = 5)
{
	std::cout << "Rezygnujesz z dzialania programu" << std::endl;
	system("pause");
	return 0;
}

i zastanów się jaki błąd popełniłeś, wytłumaczyć nie potrafie bo jest zbyt banalny(tzn. za dużo pisania)

obrazek

http://screenshooter.net/4892623/ekdaieu

i to wywalasz

			case 5:
		std::cout << "Rezygnujesz z dzialania programu";
		break;

Opublikowano

@jackyraumund

 

ja nigdzie nie podalem tego kodu co ty tam podales.. chyba ze pierwszym zadaniu to widze ze zamiast porownac przypisalem do if'a :) No i return 0; powinien byc na samym koncu xD

albo jestem takim noobem ze nie widze innego blędu xD

Opublikowano

Widzę że komuś w tym temacie wieeelkie problemy sprawia składnia like-C. W takim razie polecam przerzucić się na jakąś jednoznaczną składnię(umhh...Ada...)...

Cytat

 

Orientacja seksualna polega na tym, że jeden mężczyzna lubi blondynki, drugi szatynki, że jedna pani woli umięśnionych mężczyzn a inna chudych intelektualistów. Homoseksualizm nie jest orientacją jest chorobą za którą homoseksualiści nie ponoszą odpowiedzialności. Pewna grupa ludzi rodzi się upośledzona fizycznie, na przykład bez ręki ale czy to znaczy, że wszystkim zdrowym powinniśmy też obcinać ręce? Nie, powinniśmy zapewnić im protezy. Obowiązkiem państwa jest zapewnienie homoseksualistom, jak wszystkim upośledzonym fizycznie czy psychicznie profesjonalnej opieki medycznej.

Opublikowano

@jackyraumund

 

ja nigdzie nie podalem tego kodu co ty tam podales.. chyba ze pierwszym zadaniu to widze ze zamiast porownac przypisalem do if'a :) No i return 0; powinien byc na samym koncu xD

albo jestem takim noobem ze nie widze innego blędu xD

z tego

http://www.mpcforum....ost__p__3755301

cały kod

#include "StdAfx.h"
#include <iostream>
int main()
{
std::cout << "Witaj w Kalkulatorze by Beny v1" << std::endl;
int liczba;
int x;
do
{
std::cout << "Menu: " << std::endl;
std::cout << "[1] Dodawanie " << std::endl;
std::cout << "[2] Odejmowanie " << std::endl;
std::cout << "[3] Mnozenie " << std::endl;
std::cout << "[4] Dzielenie " << std::endl;
std::cout << "[5] Rezygnuj " << std::endl;
std::cout << "Wprowadz liczbe : ";
std::cin >> liczba;
std::cin.clear();
std::cin.ignore( 256, '\n' );
if(liczba = 5)
{
	std::cout << "Rezygnujesz z dzialania programu" << std::endl;
	system("pause");
	return 0;
}
if( liczba != 0 )
{
		std::cout << "Wybierz dzialanie: ";
		std::cin >> x;
		std::cin.clear();
		std::cin.ignore ( 1000, '\n' );
}
else
		x = false;
if ( x != 0 || x <= 5 )
{

switch( x )
{
		case 1:
		std::cout << "Wynik dodawania to: " << liczba + 7 << std::endl;
		break;
		case 2:
		std::cout << "Wynik odejmowania to: " << liczba - 7 << std::endl;
		break;
		case 3:
		std::cout << "Wynik mnozenia to: " << liczba * 7 << std::endl;
		break;
		case 4:
		std::cout << "Wynik dzielenia to: " << liczba / 7 << std::endl;
		break;
		default:
		std::cout << "Niestety, wybrales nieprawidlowe dzialanie, program zostanie wylaczony";
		break;
}
}
} while ( x );
return 0;
}

return to funkcja która zwraca wartosc i wychodzi z funkcji

np.

int blabla()
{
return 212;
}
int main()
{
int hehe = blabla();
std::cout << hehe << std::endl;
system("pause");
}

zmienna hehe bedzie miala wartosc 212

@down

a jak to się zwało? xD

Opublikowano

aaaa ;) już wiem dlaczego tak ja napisałem a nie inaczej:P Uczę się c++ z stronki cppox i dopiero za 2 rodziały tego co ja poszukałem bedzie o tym co mi teraz napisałeś :P a ten program to była praca domowa na koniec jednego z rodzialów.

Opublikowano
Na prawdę bardzo mi pomogłeś niczym.

To brzmi sarkastycznie, jakbym ci nie pomógł... Wybieram interpretację zjedzenia wyrazu.

 

return to funkcja która zwraca wartosc i wychodzi z funkcji

Return to nie funkcja, a keyword, która wrzuca na stos wartość i skacze.

W C++, każda funkcja (poza void) musi zwracać wynik. Gdyby return było funkcją, musiałoby zwracać wynik, więc mieć procedurę od zwracania wyniku, która musiałaby również mieć funkcję od zwracania wyniku, która z kolei.... Return to nie funkcja i basta!

Ta sygnatura jest pusta.

Opublikowano

@up

hah, nie znam się na teori ;D

ty za info

tutaj masz bardziej obrazowy przykład returna

#include "StdAfx.h"
#include <iostream>
int blabla(int aha)
{
if(aha = 1)
{
return 100;
}
else
{
	return 50;
}
}


int main()
{
int asdf;
std::cout << "Kliknij 1 aby funkcja zwrocila 100, kliknij byle co aby zwrocila 50" << std::endl;
std::cin >> asdf;
int hehe = blabla(asdf);
std::cout << hehe << std::endl;
system("pause");
}

@down

napisałeś

No i return 0; powinien byc na samym koncu

więc ci chciałem pokazać że nie, i pokazać przykład abyś zrozumiał co te return robi

50 i 100 to przykładowa wartość

Opublikowano

4ggr35510n@ Z tym postem chodziło mi o to, że pomogłeś mi ogarnąć ten program tak na prawdę niczym (czyli średnikiem) :P

Nie będe się pytał co daje to zwracanie 50/100 jak napisałeś w przykładzie z returna, jak przeczytam kolejne 2 rodzialy na cppoxie to wtedy juz bede mniej wiecej wiedzial o co b, chce robić wszystko po kolei.

Opublikowano

@4ggr35510n no tak przecież ktoś kto programuje od kilku dni bez problemu zrozumie że return to keyword, który wrzuca na stos wartość i skacze, to takie oczywiste.

Opublikowano

Ja wyznaję zasadę "byleby dzwoniło". Nieważne w którym kościele.

 

@EDIT @UP @DOWN

Masz entry point procedury. Skądś przecież zaczyna się wykonywanie rzędu poleceń. To miejsce zapisywane jest na stosie.

Po wykonaniu funkcji, return "skacze" do zapisanego adresu (przy okazji zdejmując, usuwając go ze stosu); "linii kodu" w której została wywołana dana funkcja. Przy okazji "zwraca" daną wartość. Zwracana wartość zapisywana jest tymczasowo na stosie i stamtąd zdejmowana i dalej obrabiana.

 

Stos to liniowa struktura danych będąca buforem typu FIFO. Służy jako tymczasowa przechowalnia danych pojedynczego wątku.

Naprawdę nie rozumiem gdzie tu trudność.

Ta sygnatura jest pusta.

Opublikowano

@4ggr35510n no tak przecież ktoś kto programuje od kilku dni bez problemu zrozumie że return to keyword, który wrzuca na stos wartość i skacze, to takie oczywiste.

jak on to mi odpisywał...

poza tym kolega już wie co to return(propably) jak można się nie skapnąć ocb. w tym zdaniu? "wrzuca na stos wartość i skacze" ? ja jestem początkującym i jakoś bez znajomości asm jakoś zczaiłem

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...